#pragma once

#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <cassert>

#define DEV "/dev/null" // null是Linux下一个丢弃信息的文件，没用的信息可以写进去。读什么也读不出

void daemonSelf()
{
    // 1.让调用该函数的进程忽略掉异常的信号
    signal(SIGPIPE, SIG_IGN); // 读端关闭后，写端再写就崩溃。当客户端关闭，服务器还写时会崩溃，所以设置忽略

    // 2.让该进程不是组长，主进程是不是组长不确定，但其子进程一定不是
    if (fork() > 0)
        exit(0);
    // 子进程。    守护进程（精灵进程）本质就是孤儿进程的一种
    pid_t n = setsid();
    assert(n != -1);

    // 3.守护进程是脱离终端的，关闭或重定向以前进程默认打开的终端文件（0、1、2）
    int fd = open(DEV, O_RDWR);
    if (fd > 0)
    {
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);

        close(fd);
    }
    else
    {
        close(0);
        close(1);
        close(2);
    }
    // 4.可选：更改进程执行路径
    // chdir(/);
}